package com.boardgame.example.tris;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

import com.boardgame.example.tris.impl.CellaTris;
import com.boardgame.example.tris.impl.GiocatoreTris;
import com.boardgame.example.tris.impl.GiocoGiocoTris;
import com.boardgame.example.tris.impl.MossaTris;
import com.boardgame.example.tris.impl.PezzoTris;
import com.boardgame.example.tris.temp.GiocaPiazzamentoRandom;
import com.boardgame.example.tris.temp.TempViewSystem;
import com.boardgamelib.base.entity.TabelloneQuadrato;
import com.boardgamelib.entity.StatoGioco;
import com.boardgamelib.errors.BoardGameLibException;

public class TrisActivity extends Activity {

	private GiocoGiocoTris gioco;
	private StatoGioco<GiocatoreTris> ultimoStato;
	private GiocaPiazzamentoRandom<CellaTris, GiocatoreTris, PezzoTris, MossaTris> giocaPiazzamentoRandom;
	
	private TempViewSystem viewSystem;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
    	gioco = new GiocoGiocoTris();
    	giocaPiazzamentoRandom = new GiocaPiazzamentoRandom<CellaTris, GiocatoreTris, PezzoTris, MossaTris>();
        
        findViewById(R.id.main).setOnClickListener(new OnClickListener() {
			public void onClick(View v) {
				try {
					step();
				} catch (BoardGameLibException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		});
        
        viewSystem = new TempViewSystem(this);
    }

    public void step() throws BoardGameLibException {
    	boolean faiNaMossa = false;
    	if (ultimoStato == null) {
    		// Abbiamo appena cominciato !!!
			Toast.makeText(this, " Inizio nuova partita ", Toast.LENGTH_LONG).show();
			faiNaMossa = true;
    	} else {
    		// Se nell'ultimo stato avevo un vincitore o un pareggio, ricomincio
    		if (ultimoStato.isFinito()) {
    			if (ultimoStato.getVincitore() != null) {
    				Toast.makeText(this, " And the winner is " + ultimoStato.getVincitore().getNome(), Toast.LENGTH_LONG).show();
    			} else if (ultimoStato.isPareggio()) {
    				Toast.makeText(this, " Draft ! ", Toast.LENGTH_LONG).show();
    			}
    			ultimoStato = null;
    			gioco.nuovaPartita();
    		} else {
    			// Devo fare una mossa ..
    			faiNaMossa = true;
    		}
    	}
    	if (faiNaMossa) {
			ultimoStato = gioco.getSistemaMosse().controllaStatoGioco(gioco.getSistemaTabellone().getTabellone(), gioco, ultimoStato);
			if (!ultimoStato.isFinito()) {
				MossaTris mt = (MossaTris)giocaPiazzamentoRandom.getMossa(gioco, ultimoStato.getProssimo(), new PezzoTris(ultimoStato.getProssimo().getTipo()));
				if (mt != null) {
					gioco.getSistemaTabellone().eseguiMossa(mt);
				}
				
			} else {
				// Brutto, codice duplicato, da sistemare.
    			if (ultimoStato.getVincitore() != null) {
    				Toast.makeText(this, " And the winner is " + ultimoStato.getVincitore().getNome(), Toast.LENGTH_LONG).show();
    			} else if (ultimoStato.isPareggio()) {
    				Toast.makeText(this, " Draft ! ", Toast.LENGTH_LONG).show();
    			}
    			ultimoStato = null;
    			gioco.nuovaPartita();
				
			}
    		
    	}
		viewSystem.tabelloneToLayout((TabelloneQuadrato<CellaTris, PezzoTris>) gioco.getSistemaTabellone().getTabellone(), (ultimoStato==null?null:ultimoStato.getProssimo()));    	
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}
